package common;

public class CommonPageUtil {
	public static final int DEFAULT_PAGE_SIZE = 20;
	public static final int DEFAULT_BLOCK_SIZE = 5;

	/** 전체 게시물수 */
	private int totalItemCount = 0;

	/** 전체 페이지수 */
	private int totalPageCount = 0;

	// 현재 페이지
	private int currentPage = 0;

	/** 한 화면당 보여줄 게시물수 */
	private int pageSize = 0;

	/** 한 화면당 보여줄 블럭수 [1][2][3].... */
	private int blockSize = 0;

	// private int totalBlockCount = 0;//전체 블럭수

	// 생성자
	public CommonPageUtil(int totalItemCount, int currentPage) throws Exception {
		this(totalItemCount, currentPage, DEFAULT_PAGE_SIZE, DEFAULT_BLOCK_SIZE);
	}

	// 생성자
	public CommonPageUtil(int totalItemCount, int currentPage, int pageSize,
			int blockSize) throws Exception {

		try {
			this.totalItemCount = totalItemCount;
			this.currentPage = currentPage;
			this.pageSize = pageSize;
			this.blockSize = blockSize;

			// 전체페이지 갯수
			this.totalPageCount = this.totalItemCount / this.pageSize;
			if (this.totalItemCount % this.pageSize > 0)
				this.totalPageCount++;

			if (this.currentPage > this.totalPageCount) {
				//throw new IllegalArgumentException("Exception : err-101");
			}

			// 전체블럭갯수
			// [1][2][3] 의 한 블럭이 몇개 인지를 계산한다.
			/*
			 * this.totalBlockCount = this.totalPageCount / this.blockSize;
			 * if(this.totalPageCount % this.blockSize > 0)
			 * this.totalBlockCount++;
			 */
		} catch (Exception e) {
			throw e;
		}
	}

	// 현재 페이지에 해당하는 블럭을 리턴한다.
	// [1][2][3] , [4][5][6] , [7][8][9] 처럼 3개의 블럭이 있을경우
	// 현재 페이지가 1,2,3일때는 리턴되는 현재블럭값은 1
	// 현재 페이지가 4,5,6일때는 리턴되는 현재블럭값은 2
	public int getCurrentBlock() {
		int result = (this.currentPage / this.blockSize) + 1;
		if (this.currentPage % this.blockSize == 0)
			result--;

		return result;
	}

	// 한 블럭내의 페이지 스타트 번호
	public int getStartBlockNo() {
		return ((getCurrentBlock() * this.blockSize) - this.blockSize) + 1;
	}

	// 한 블럭내의 페이지 END 번호
	public int getEndBlockNo() {
		int result = getCurrentBlock() * this.blockSize;
		if (result > this.totalPageCount)
			result = this.totalPageCount;

		return result;
	}

	// 이전 블럭이 있는지?
	public boolean hasPrevBlock() {
		return getCurrentBlock() > 1;
	}

	// 이후 블럭이 있는지
	public boolean hasNextBlock() {
		return getEndBlockNo() < this.totalPageCount;
	}

	// 이전 블럭
	public int getPrevBlock() {
		int result = this.currentPage - this.blockSize;
		if (result < 1)
			result = 1;

		return result;

	}

	// 이후 블럭
	public int getNextBlock() {
		int result = this.currentPage + this.blockSize;
		if (result > this.totalPageCount)
			result = this.totalPageCount;

		return result;
	}

	//현재 페이지
	public int getCurrentPage() {
		return this.currentPage;
	}
	
	//이전 페이지
	public int getPrevPage() {
		int result = this.currentPage - 1;
		if (result < 1)
			result = 1;

		return result;

	}

	//이전 페이지
	public int getStartPage() {
		int result = 1;
		if (result < 1)
			result = 1;

		return result;

	}

	//다음 페이지
	public int getNextPage() {
		int result = this.currentPage + 1;
		if (result > this.totalPageCount)
			result = this.totalPageCount;

		return result;

	}
	
	//마지막 페이지
	public int getEndPage() {
		int result = this.totalPageCount;
		if (result > this.totalPageCount)
			result = this.totalPageCount;

		return result;

	}

}
